package utils;

import java.util.Objects;
import java.util.Random;

public class StringUtils {
    private static final String UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final String LOWER = UPPER.toLowerCase();
    private static final String DIGITS = "0123456789";
    private static final String ALPHANUM = UPPER + LOWER + DIGITS;

    public static String generateRandomString(int length) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder(length);

        for (int i = 0; i < length; i++) {
            int index = random.nextInt(ALPHANUM.length());
            sb.append(ALPHANUM.charAt(index));
        }

        return sb.toString();
    }

    public static String extractBeforeFirstAtOrDefault(String input) {
        if (input == null) {
            return null;
        }
        // 截取从字符串开始到第一个 "@" 为止的部分
        return input.replaceAll("(?<!@)(@)(?!@).*", "$1");
    }

    public static boolean isGarbledCode(String input) {
        // 返回字符串是否存在乱码
        return input.matches(".*[^\\p{Print}]+.*");
    }

    /**
     * 确保文件名长度不超过指定的最大长度。
     *
     * @param originalFilename 原始文件名
     * @param maxLength        允许的最大长度
     * @return 截断后的文件名
     */
    public static String truncateFilenameWithExtension(String originalFilename, int maxLength) {
        int dotIndex = originalFilename.lastIndexOf('.');
        if (dotIndex == -1 || originalFilename.length() <= maxLength) {
            return originalFilename;
        }

        // 确保即使截断后也保留扩展名
        String namePart = originalFilename.substring(0, dotIndex);
        String extensionPart = originalFilename.substring(dotIndex);

        if (namePart.length() <= maxLength - extensionPart.length()) {
            return originalFilename.substring(0, maxLength);
        } else {
            // 如果文件名部分加上扩展名长度超过最大长度，则只截断文件名部分
            return originalFilename.substring(0, maxLength - extensionPart.length()) + extensionPart;
        }
    }

    /**
     * 检查给定的字符串是否为null或者为空。
     *
     * @param str 需要检查的字符串
     * @return 如果字符串为null或者为空，返回true；否则返回false。
     */
    public static boolean isNullOrEmpty(Object str) {
        return str == null || str.toString().isEmpty() || str.toString().trim().isEmpty();
    }

}
